#include <QCoreApplication>

#include <QDebug>

#include <QSharedPointer>

class Test
{
public:
    Test(int v) : a(v) {}
    int a;
};

void test_sharepointer()
{
    QList<QSharedPointer<Test>> l;
//    QSharedPointer<Test> t(new Test(2));
    {
    QSharedPointer<Test> t(new Test(2));
    l.append(t);

    qDebug()<<t<<" t.a="<<t->a;
    }

    {
    QSharedPointer<Test> t = l.first();

    qDebug()<<t<<" t.a="<<t->a;
    }

    Test *test = NULL;
    {
        QSharedPointer<Test> t = l.first();
        l.removeAt(0);        //如果该代码注释掉，则在该代码块中t的引用为减为0，空间为释放掉，那么test则会指定无效地址
        qDebug()<<l<<" t.a="<<t->a;
        test = t.data();
    }
    qDebug()<<l<<" t.a="<<test->a;

    QSharedPointer<Test> t1;
    {
        QSharedPointer<Test> t(new Test(3));
        t1 = t;
        qDebug()<<__LINE__<<":"<<t->a<<"addr:"<<t.data();
    }
    qDebug()<<__LINE__<<":"<<t1->a<<"addr:"<<t1.data();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    test_sharepointer();

//    return a.exec();
}
